package exemplos;

import java.util.Map;

import interfacesFerrovia.DefsGlobais.TipoAtributo;
import interfacesFerrovia.DefsGlobais.TipoElemento;
import grafico.GraficoListener;
import malhaFerroviaria.Ferrovia;
import mc857.EventHandler;

/**
 * Exemplo de uso do Simulador da malha ferroviï¿½ria e do mï¿½dulo grï¿½fico
 * gentilmente cedido pelo grupo do Luiz Guilherme, Leandro e Leonardo.
 * A classe Ferrovia ï¿½ a 'fachada' (design pattern faï¿½ade) para
 * as classes que implementam os elementos da malha ferroviï¿½ria.
 * Ela tambï¿½m ï¿½ implementa o pattern 'singleton': uma ï¿½nica instï¿½ncia
 * da ferrovia ï¿½ criada.
 * Essa classe implementa a interface ControleFerrovia, que prevï¿½
 * a publicaï¿½ï¿½o dos mï¿½todos necessï¿½rios para o Centro de Controle.
 * @author Vanini
 *
 */

public class Exemplo1Gr {
	


	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args){
		
		// 1 - Pegar a instï¿½ncia ï¿½nica da Ferrovia
		Ferrovia ferrovia = Ferrovia.getInstance();
		
		// 2 - Definir um cenï¿½rio para a simulaï¿½ï¿½o
		ferrovia.defineCenario(1);
		//TODO Cenario 7 exige MUDANCA de ITINERARIO para evitar colisao no meio, OU controlar velocidade para evitar se encontrarem no mesmo trecho
		// 3 - Registrar os tratadores de evento
//		ferrovia.registraTratadorDeEventos(new Console());
		ferrovia.registraTratadorDeEventos(new GraficoListener());
		ferrovia.registraTratadorDeEventos(new EventHandler());
		
//		ferrovia.mudarChave("x1", "t1", "t4");
//		ferrovia.frearComposicao("comp02", 10f, 5f);
//		System.out.println(ferrovia.consultaAtributo("t1", TipoAtributo.ID_TR_CH_A));
		String[] elementos = (String[]) ferrovia.consultaElementos();
		for(String e : elementos)
		{
			TipoElemento tipoElemento = (TipoElemento) ferrovia.consultaAtributo(e, TipoAtributo.TIPO);
			if(tipoElemento.equals(TipoElemento.COMPOSICAO))
			{
				System.out.println("Atributos composicao: " + e);
				Map<TipoAtributo, Object> estado = ferrovia.consultaEstado(e);
				for(TipoAtributo tipo : estado.keySet())
				{
					System.out.println("\tTipoAtributo: " + tipo.toString() + ". Valor: " + estado.get(tipo));
				}
				String[] itinerario = (String[]) ferrovia.consultaAtributo(e, TipoAtributo.ITINERARIO);
				System.out.print("Itinerario " + e + ": ");
				for(String string : itinerario)
				{
					System.out.print(" " + string);
				}
				System.out.println();
			}
		}
		
		// 4 - Rodar a simulaï¿½ï¿½o
		try{
			ferrovia.simularCenario(0, 5000);
		}catch(Exception ee){
			System.out.println("Exceï¿½ï¿½o:"+ee.getClass().getName()+"::"+ee.getMessage());
			ee.printStackTrace();
		}
		System.out.println("*=*=*= Fim da Simulaï¿½ï¿½o =*=*=*");

	}

}
